/**
 * @(#)KalendereintragMapper.java
 * 1.0, 2013-01-24
 */
package de.hdm.gruppenkalender.team04.db;

import de.hdm.gruppenkalender.team04.data.*;
import java.rmi.RemoteException;
import java.sql.*;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.DF0239A2-1E87-C9BA-0036-ADEAC716F193]
// </editor-fold>
/**
 * Mapper-Klasse, die {@link Kalendereintrag}-Objekte auf eine relationale
 * Datenbank abbildet.
 * <p>
 * Hierzu wird eine Reihe von Methoden zur Verfügung gestellt, mit deren Hilfe
 * z.B. Objekte gesucht, erzeugt, modifiziert und gelöscht werden können.
 * <p>
 * In Anlehung an:
 * de.hdm.thies.bankprojekt.db.AccountMapper
 *
 * @author Prof. Dr. Peter Thies
 *
 * @author Mathias Bendel (mb167)
 * @author Björn Fichnter (bf023)
 * @author Stefan Hettich (sh176)
 * @author René Kugel (rk044)
 * @author Mark Leonberger (ml072)
 * @author Marta Przybylski (mp070)
 *
 * @version 1.0, 2013-01-24
 *
 */
public class KalendereintragMapper {

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.F1A9EE01-F4FD-A445-8670-0B6322E36F93]
    // </editor-fold>
    /**
     * Die Klasse KalendereintragMapper wird nur einmal instantiiert. Man spricht hierbei
     * von einem sogenannten <b>Singleton</b>.
     * <p>
     * Diese Variable ist durch den Bezeichner <code>static</code> nur einmal für
     * sämtliche eventuellen Instanzen dieser Klasse vorhanden. Sie speichert die
     * einzige Instanz dieser Klasse.
     *
     * @see #kalendereintragMapper() 
     */
    private static KalendereintragMapper kalendereintragMapper;

    /**
     * Geschützter Konstruktor - verhindert die Möglichkeit, mit new neue
     * Instanzen dieser Klasse zu erzeugen.
     */
    protected KalendereintragMapper() {
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.D3CCD1BC-1941-1FBD-38B3-98402DA79A9A]
    // </editor-fold>
    /**
     * Diese statische Methode kann aufgrufen werden durch
     * <code>KalendereintragMapper.kalendereintragMapper()</code>. Sie stellt die
     * Singleton-Eigenschaft sicher, indem Sie dafür sorgt, daß nur eine einzige
     * Instanz von <code>KalendereintragMapper</code> existiert.
     *
     * @return {@link KalendereintragMapper}-Objekt.
     * @see #kalendereintragMapper
     */
    public static KalendereintragMapper kalendereintragMapper() {
        if (kalendereintragMapper == null) {
            kalendereintragMapper = new KalendereintragMapper();
        }

        return kalendereintragMapper;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.4EE656E6-9E9D-6D77-0CDB-C64E18C8C504]
    // </editor-fold>
    /**
     * Gibt ein Objekt mit übergegebener Id zurück.
     *
     * @param   id
     * @return  Kalendereintrag {@link Kalendereintrag}-Objekt, oder null wenn keines gefunden wurde.
     */
    public Kalendereintrag findeViaSchluessel(int id) {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Statement ausfüllen und als Query an die DB schicken
            ResultSet rs = stmt.executeQuery(
                    "SELECT kalendereintragId, start, ende, titel, ort, " +
                    "beschreibung, kategorieId, kalenderId, ersteller " +
                    "FROM kalendereintrag " +
                    "WHERE kalendereintragId =" + id + ";");

            // Statement ausfüllen und als Query an die DB schicken
            if (rs.next()) {
                // Umwandlung in ein {@link Kalendereintrag}-Objekt.
                Kalendereintrag k = new KalendereintragImpl();
                k.setId(rs.getInt("kalendereintragId"));
                k.setStart(rs.getTimestamp("start"));
                k.setEnde(rs.getTimestamp("ende"));
                k.setTitel(rs.getString("titel"));
                k.setOrt(rs.getString("ort"));
                k.setBeschreibung(rs.getString("beschreibung"));
                k.setKategorieId(rs.getInt("kategorieId"));
                k.setKalenderId(rs.getInt("kalenderId"));
                k.setErstellerId(rs.getInt("ersteller"));

                con.close();

                System.out.println(KalendereintragMapper.class.getName() +
                        " - findeViaSchluessel ausgeführt.");

                return k;
            }
        } catch (RemoteException ex) {
            Logger.getLogger(KalendereintragMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(KalendereintragMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.BEA56DAA-CCBB-794D-E225-84AD0947524E]
    // </editor-fold>
    /**
     * Gibt ein {@link Vector} mit {@link Kalendereintrag}-Objekten zurück,
     * die der übergebenen {@link Kalender}-Id zugeordnet ist zurück.
     *
     * @param   id
     * @return  Vector<Kalendereintrag> {@link Vector} mit {@link Kalendereintrag}-Objekten.
     */
    public Vector<Kalendereintrag> findeViaKalender(int id) {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        Vector<Kalendereintrag> result = new Vector<Kalendereintrag>();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Statement ausfüllen und als Query an die DB schicken
            ResultSet rs = stmt.executeQuery(
                    "SELECT kalendereintragId, start, ende, titel, ort, " +
                    "beschreibung, kategorieId, kalenderId, ersteller " +
                    "FROM kalendereintrag WHERE kalenderId =" + id + ";");

            /**
             * Für jeden Eintrag im Suchergebnis wird nun
             * ein {@link Kalender}-Objekt erstellt.
             */
            while (rs.next()) {
                Kalendereintrag k = new KalendereintragImpl();
                k.setId(rs.getInt("kalendereintragId"));
                k.setStart(rs.getTimestamp("start"));
                if (rs.getDate("ende") != null) {
                    k.setEnde(rs.getTimestamp("ende"));
                } else {
                    k.setEnde(null);
                }
                k.setTitel(rs.getString("titel"));
                k.setOrt(rs.getString("ort"));
                k.setBeschreibung(rs.getString("beschreibung"));
                k.setKategorieId(rs.getInt("kategorieId"));
                k.setKalenderId(rs.getInt("kalenderId"));
                k.setErstellerId(rs.getInt("ersteller"));
                result.addElement(k);
            }

            System.out.println(KalendereintragMapper.class.getName() +
                    " - findeViaKalender ausgeführt.");

            return result;

        } catch (RemoteException ex) {
            Logger.getLogger(KalendereintragMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(KalendereintragMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.3C5764FA-9633-4BC1-4AC2-FF4C191996B3]
    // </editor-fold>
    /**
     * Gibt ein {@link Vector} mit {@link Kalendereintrag}-Objekten zurück,
     * die der übergebenen {@link Kalender} zugeordnet ist zurück.
     *
     * @param   ka
     * @return  Vector<Kalendereintrag> {@link Vector} mit {@link Kalendereintrag}-Objekten.
     */
    public Vector<Kalendereintrag> findeViaKalender(Kalender ka) {
        try {
            return this.findeViaKalender(ka.getKalenderId());
        } catch (RemoteException ex) {
            Logger.getLogger(KalendereintragMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.DA7786F9-189E-DFDD-2DC9-9A90B34B0CCB]
    // </editor-fold>
    /**
     * Auslesen aller {@link Kalendereintrag}-Objekte.
     *
     * @return  Vector<Kalendereintrag> Ein {@link Vector} mit {@link Kalendereintrag}-Objekten.
     */
    public Vector<Kalendereintrag> findeAlle() {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        Vector<Kalendereintrag> result = new Vector<Kalendereintrag>();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Statement ausfüllen und als Query an die DB schicken
            ResultSet rs = stmt.executeQuery(
                    "SELECT kalendereintragId, start, ende, titel, ort, " +
                    "beschreibung, kategorieId, kalenderId, ersteller " +
                    "FROM kalendereintrag  ORDER BY kalendereintragId");

            /**
             * Für jeden Eintrag im Suchergebnis wird nun
             * ein {@link Kalendereintrag}-Objekt erstellt.
             */
            while (rs.next()) {
                Kalendereintrag k = new KalendereintragImpl();
                k.setId(rs.getInt("kalendereintragId"));
                k.setStart(rs.getTimestamp("start"));
                if (rs.getDate("ende") != null) {
                    k.setEnde(rs.getTimestamp("ende"));
                } else {
                    k.setEnde(null);
                }
                k.setTitel(rs.getString("titel"));
                k.setOrt(rs.getString("ort"));
                k.setBeschreibung(rs.getString("beschreibung"));
                k.setKategorieId(rs.getInt("kategorieId"));
                k.setKalenderId(rs.getInt("kalenderId"));
                k.setErstellerId(rs.getInt("ersteller"));
                System.out.println("id: " + k.getId() +
                        " start: " + k.getStart().toString() + " ende: " + k.
                        getEnde().
                        toString() + " titel: " + k.getTitel() +
                        " kategorie: " + k.getKategorieId());
                result.addElement(k);
            }

            System.out.println(KalendereintragMapper.class.getName() +
                    " - findeAlle ausgeführt.");

            return result;

        } catch (RemoteException ex) {
            Logger.getLogger(KalendereintragMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(KalendereintragMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.81A0B00C-AA4D-5A88-7BDD-53E1D8EBBE74]
    // </editor-fold>
    /**
     * Einfügen eins {@link Kalendereintrag}-Objekts in die Datenbank.
     *
     * @param   k   das zu speichernde Objekt
     * @return  das gespeicherte Objekt.
     */
    public Kalendereintrag einfuegen(Kalendereintrag k) {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Aktuell größte Id in der Datenbak wird abgerufen.
            ResultSet rs = stmt.executeQuery(
                    "SELECT MAX(kalendereintragId) AS maxid " +
                    "FROM kalendereintrag ");
            if (rs.next()) {
                k.setId(rs.getInt("maxid") + 1);

                // Statement ausfüllen und als Query an die DB schicken
                stmt.executeUpdate(
                        "INSERT INTO kalendereintrag (kalendereintragId, " +
                        "start, ende, titel, ort, beschreibung, kategorieId, " +
                        "kalenderId, ersteller) VALUES ('" +
                        k.getId() + "','" +
                        k.getStart() + "'," +
                        (k.getEnde() == null ? "NULL" : "'" + k.getEnde() + "'") +
                        ",'" +
                        k.getTitel() + "','" +
                        k.getOrt() + "','" +
                        k.getBeschreibung() + "'," +
                        (k.getKategorieId() == 0 ? "NULL" : "'" +
                        k.getKategorieId() + "'") + ",'" +
                        k.getKalenderId() + "','" +
                        k.getErstellerId() + "');");

                con.close();

                System.out.println(KalendereintragMapper.class.getName() +
                        " - einfuegen ausgeführt.");

                return k;
            }
        } catch (RemoteException ex) {
            Logger.getLogger(KalendereintragMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(KalendereintragMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.8676B308-E86E-C020-739A-D65C68A77336]
    // </editor-fold>
    /**
     * Wiederholtes Schreiben eines Objekts in die Datenbank.
     * 
     * @param   k   das Objekt, das in die DB geschrieben werden soll
     * @return  das als Parameter übergebene Objekt
     */
    public Kalendereintrag aktualisieren(Kalendereintrag k) {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Statement ausfüllen und als Query an die DB schicken
            stmt.executeUpdate("UPDATE kalendereintrag " +
                    "SET start='" + k.getStart() + "', " +
                    "ende=" +
                    (k.getEnde() == null ? "NULL" : "'" + k.getEnde() + "'") +
                    ", " +
                    "titel='" + k.getTitel() + "', " +
                    "ort='" + k.getOrt() + "', " +
                    "beschreibung='" + k.getBeschreibung() + "', " +
                    "kategorieId=" + (k.getKategorieId() == 0 ? "NULL" : "'" +
                    k.getKategorieId() + "'") + ", " +
                    "kalenderId='" + k.getKalenderId() + "', " +
                    "ersteller='" + k.getErstellerId() + "' " +
                    "WHERE kalendereintragId=" + k.getId());

            System.out.println(KalendereintragMapper.class.getName() +
                    " - aktualisieren ausgeführt.");

            return k;

        } catch (RemoteException ex) {
            Logger.getLogger(KalendereintragMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(KalendereintragMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.22A72520-C313-4AE7-6F24-85898FFACF9B]
    // </editor-fold>
    /**
     * Löschen der Daten eines {@link Kalendereintrag}-Objekts aus der Datenbank.
     *
     * @param   id  des aus der DB zu löschenden "Objekts".
     */
    public void loeschen(int id) {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Statement ausfüllen und als Query an die DB schicken
            stmt.executeUpdate("DELETE FROM kalendereintrag " +
                    "WHERE kalendereintragId=" + id);

            System.out.println(KalendereintragMapper.class.getName() +
                    " - loeschen ausgeführt.");

        } catch (SQLException ex) {
            Logger.getLogger(KalendereintragMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.55A77034-B2A2-038F-8A41-8D84FD3DB251]
    // </editor-fold>
    /**
     * Löschen der Daten eines {@link Kalendereintrag}-Objekts aus der Datenbank.
     *
     * @param   k  das aus der DB zu löschende "Objekt".
     */
    public void loeschen(Kalendereintrag k) {
        try {
            this.loeschen(k.getId());
        } catch (RemoteException ex) {
            Logger.getLogger(KalendereintragMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
    }
}
